/*给定正整数 n，找到若干个完全平方数（比如 1, 4, 9, 16, ...）使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
* 给你一个整数 n ，返回和为 n 的完全平方数的 最少数量 。
* 完全平方数 是一个整数，其值等于另一个整数的平方；换句话说，其值等于一个整数自乘的积。例如，1、4、9 和 16 都是完全平方数，
* 而 3 和 11 不是。
*
* 输入：n = 12
* 输出：3
* 解释：12 = 4 + 4 + 4
* */

package Leetcode;

import java.util.Arrays;

public class leetcode279 {

    public static void main(String[] args) {

        leetcode279 obj = new leetcode279();
        int n = 12;
        System.out.println(obj.numSquares(n));
    }

    public int numSquares(int n){

        //定义dp数组，其中dp[i]表示和为i的完全平方数的最少数量
        int[] dp = new int[n + 1];
        for (int i = 1;i <= n;i++){
            int minn = Integer.MAX_VALUE;
            for (int j = 1;j*j <= i;j++){
                minn = Math.min(dp[i - j * j], minn);
            }
            dp[i] = minn + 1;
        }
        return dp[n];
    }
}
